package java_thinking.unit_21._21_7;

import java.util.concurrent.*;

import static java_thinking.unit_21._21_5.LaunderThrowable.launderThrowable;

/**
 * @Desc:   7-10 通过 Future 来取消任务
 *          1.
 * @author: cww
 * @DateTime: 2019/6/14 20:20
 */

public class TimedRun {
    private final static ExecutorService exec = Executors.newCachedThreadPool();
    public static void timedRun(Runnable r, TimeUnit unit, long timeout){
        Future<?> task = exec.submit(r);
        try {
            task.get(timeout,unit);
        } catch (InterruptedException e) {
            //也有可能是被中断，如果需要则 记录中断状态，并在finally中恢复中断，前提是你知道
            //不再需要结果了

        } catch (ExecutionException e) {
            //如果是执行任务抛出异常，那么往上层抛，
            throw launderThrowable(e);
        } catch (TimeoutException e) {
            //抛出超时错误，那么根据实际情况处理，通常是结束(取消)任务，前提是你知道
            //不再需要结果了
        } finally {
            //如果任务执行结束执行 cancel 也不会的带来任何影响
            //如果任务正在运行则被取消
            task.cancel(true);
        }
    }
}
